home *** CD-ROM | disk | FTP | other *** search
-
- EXP(3) UNIX Programmer's Manual EXP(3)
-
- NNAAMMEE
- eexxpp, eexxppmm11, lloogg, lloogg1100, lloogg11pp, ppooww - exponential, logarithm, power func-
- tions
-
- SSYYNNOOPPSSIISS
- ##iinncclluuddee <<mmaatthh..hh>>
-
- _d_o_u_b_l_e
- eexxpp(_d_o_u_b_l_e _x)
-
- _f_l_o_a_t
- eexxppff(_f_l_o_a_t _x)
-
- _d_o_u_b_l_e
- eexxppmm11(_d_o_u_b_l_e _x)
-
- _f_l_o_a_t
- eexxppmm11ff(_f_l_o_a_t _x)
-
- _d_o_u_b_l_e
- lloogg(_d_o_u_b_l_e _x)
-
- _f_l_o_a_t
- llooggff(_f_l_o_a_t _x)
-
- _d_o_u_b_l_e
- lloogg1100(_d_o_u_b_l_e _x)
-
- _f_l_o_a_t
- lloogg1100ff(_f_l_o_a_t _x)
-
- _d_o_u_b_l_e
- lloogg11pp(_d_o_u_b_l_e _x)
-
- _f_l_o_a_t
- lloogg11ppff(_f_l_o_a_t _x)
-
- _d_o_u_b_l_e
- ppooww(_d_o_u_b_l_e _x, _d_o_u_b_l_e _y)
-
- _f_l_o_a_t
- ppoowwff(_f_l_o_a_t _x, _f_l_o_a_t, _y_")
-
- DDEESSCCRRIIPPTTIIOONN
- The eexxpp() function computes the exponential value of the given argument
- _x.
-
- The eexxppmm11() function computes the value exp(x)-1 accurately even for tiny
- argument _x.
-
- The lloogg() function computes the value of the natural logarithm of argu-
- ment _x_.
-
- The lloogg1100() function computes the value of the logarithm of argument _x to
- base 10.
-
- The lloogg11pp() function computes the value of log(1+x) accurately even for
- tiny argument _x.
-
- The ppooww() computes the value of _x to the exponent _y.
-
- EERRRROORR ((dduuee ttoo RRoouunnddooffff eettcc..))
- exp(x), log(x), expm1(x) and log1p(x) are accurate to within an _u_l_p, and
- log10(x) to within about 2 _u_l_p_s; an _u_l_p is one _U_n_i_t in the _L_a_s_t _P_l_a_c_e.
- The error in ppooww(_x, _y) is below about 2 _u_l_p_s when its magnitude is moder-
- ate, but increases as ppooww(_x, _y) approaches the over/underflow thresholds
- until almost as many bits could be lost as are occupied by the float-
- ing-point format's exponent field; that is 8 bits for VAX D and 11 bits
- for IEEE 754 Double. No such drastic loss has been exposed by testing;
- the worst errors observed have been below 20 _u_l_p_s for VAX D, 300 _u_l_p_s for
- IEEE 754 Double. Moderate values of ppooww() are accurate enough that
- ppooww(_i_n_t_e_g_e_r, _i_n_t_e_g_e_r) is exact until it is bigger than 2**56 on a VAX,
- 2**53 for IEEE 754.
-
- RREETTUURRNN VVAALLUUEESS
- These functions will return the appropriate computation unless an error
- occurs or an argument is out of range. The functions eexxpp(), eexxppmm11() and
- ppooww() detect if the computed value will overflow, set the global variable
- _e_r_r_n_o _t_o ERANGE and cause a reserved operand fault on a VAX or Tahoe. The
- function ppooww(_x, _y) checks to see if _x < 0 and _y is not an integer, in the
- event this is true, the global variable _e_r_r_n_o is set to EDOM and on the
- VAX and Tahoe generate a reserved operand fault. On a VAX and Tahoe,
- _e_r_r_n_o is set to EDOM and the reserved operand is returned by log unless _x
- > 0, by lloogg11pp() unless _x > -1.
-
- NNOOTTEESS
- The functions exp(x)-1 and log(1+x) are called expm1 and logp1 in BASIC
- on the Hewlett-Packard HP-71B and APPLE Macintosh, EXP1 and LN1 in Pas-
- cal, exp1 and log1 in C on APPLE Macintoshes, where they have been pro-
- vided to make sure financial calculations of ((1+x)**n-1)/x, namely
- expm1(n*log1p(x))/x, will be accurate when x is tiny. They also provide
- accurate inverse hyperbolic functions.
-
- The function ppooww(_x, _0) returns x**0 = 1 for all x including x = 0, Infin-
- ity (not found on a VAX), and _N_a_N (the reserved operand on a VAX).
- Previous implementations of pow may have defined x**0 to be undefined in
- some or all of these cases. Here are reasons for returning x**0 = 1 al-
- ways:
-
- 1. Any program that already tests whether x is zero (or infinite or
- _N_a_N) before computing x**0 cannot care whether 0**0 = 1 or not.
- Any program that depends upon 0**0 to be invalid is dubious any-
- way since that expression's meaning and, if invalid, its conse-
- quences vary from one computer system to another.
-
- 2. Some Algebra texts (e.g. Sigler's) define x**0 = 1 for all x, in-
- cluding x = 0. This is compatible with the convention that ac-
- cepts a[0] as the value of polynomial
-
- p(x) = a[0]*x**0 + a[1]*x**1 + a[2]*x**2 +...+ a[n]*x**n
-
- at x = 0 rather than reject a[0]*0**0 as invalid.
-
- 3. Analysts will accept 0**0 = 1 despite that x**y can approach any-
- thing or nothing as x and y approach 0 independently. The reason
- for setting 0**0 = 1 anyway is this:
-
- If x(z) and y(z) are _a_n_y functions analytic (expandable in
- power series) in z around z = 0, and if there x(0) = y(0) =
- 0, then x(z)**y(z) -> 1 as z -> 0.
-
- 4. If 0**0 = 1, then infinity**0 = 1/0**0 = 1 too; and then _N_a_N**0 =
- 1 too because x**0 = 1 for all finite and infinite x, i.e., inde-
- pendently of x.
-
- SSEEEE AALLSSOO
- math(3), infnan(3)
-
- HHIISSTTOORRYY
- A eexxpp(), lloogg() and ppooww() functions appeared in Version 6 AT&T UNIX. A
- lloogg1100() function appeared in Version 7 AT&T UNIX. The lloogg11pp() and
- eexxppmm11() functions appeared in 4.3BSD.
-
- 4th Berkeley Distribution July 31, 1991 3
-